//
//  ViewController.m
//  sqliteDemo
//
//  Created by hpkj on 2020/1/17.
//  Copyright © 2020 hpkj. All rights reserved.
//

#import "ViewController.h"

#import <sqlite3.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}


-(NSString *)sqliteFilePath{
//    获取cache目录
    NSString * cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

//    拼接文件名字
    NSString * databasePath = [cachePath stringByAppendingString:@"contacts.sqlite"];
    return databasePath;
}

//创建数据表
-(void)creatSqliteTable{
//    获取数据库文件路径
    NSString * dbFilePath = [self sqliteFilePath];
//    将路径字符串转化成UTF-8
    char* dbPath = [dbFilePath UTF8String];
    
    //声明sqlite数据库结构体的指针
    sqlite3* contactDB;
//    sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)
//    sqlite3_open(dbPath, &contactDB)表示打开dbPath路径下的数据库，如果不存在，则创建它
    if(sqlite3_open(dbPath, &contactDB) == SQLITE_OK){
        NSLog(@"数据库打开成功");
    }else
    {
        NSLog(@"数据库打开失败");
    }
        
//    生成指令
    
//    创建数组
    char sqlite_stmt[1000];
//    向数组填充字符串
    snprintf(sqlite_stmt, 1000,
             "CREATE TABLE CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT, PHONE TEXT)");
    
    //执行语句
//    第一个参数，数据库结构体指针
//    第二个参数，sqlite语句
//    第三个参数和第四个参数，回调方法NULL表示不使用回调
//    第五个参数，返回错误信息NULL表示不使用错误信息
//    sqlite3_exec(<#sqlite3 *#>, <#const char *sql#>, <#int (*callback)(void *, int, char **, char **)#>, <#void *#>, <#char **errmsg#>)
    if(sqlite3_exec(contactDB, sqlite_stmt, NULL, NULL, NULL) == SQLITE_OK){
      NSLog(@"创建表成功");
    }else
    {
        NSLog(@"创建表失败");
    }
    
    //关闭数据库，释放资源
//    sqlite3_close(<#sqlite3 *#>)
    sqlite3_close(contactDB);
}

//增加数据
-(void)addRow{
//    常规操作，打开数据库
    //    获取数据库文件路径
        NSString * dbFilePath = [self sqliteFilePath];
    //    将路径字符串转化成UTF-8
        char* dbPath = [dbFilePath UTF8String];
        
        //声明sqlite数据库结构体的指针
        sqlite3* contactDB;
    //    sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)
    //    sqlite3_open(dbPath, &contactDB)表示打开dbPath路径下的数据库，如果不存在，则创建它
        if(sqlite3_open(dbPath, &contactDB) == SQLITE_OK){
            NSLog(@"数据库打开成功");
        }else
        {
            NSLog(@"数据库打开失败");
        }
//    常规操作，打开数据库
    
    //创建指令
    char sqlite_stmt[1000];
    snprintf(sqlite_stmt, 1000,
             "INSERT INTO CONTACTS (NAME, ADDRESS, PHONE) VALUES (\"张三\",\"铁龙路\",\"18201430000\")");
//    执行指令
    if (sqlite3_exec(contactDB, sqlite_stmt, NULL, NULL, NULL) == SQLITE_OK) {
        NSLog(@"插入数据成功");
    }else
    {
        NSLog(@"插入数据失败");
    }
    
//    关闭数据库
    sqlite3_close(contactDB);
    
}

//删除数据

-(void)delteRow
{
    //    常规操作，打开数据库
        //    获取数据库文件路径
            NSString * dbFilePath = [self sqliteFilePath];
        //    将路径字符串转化成UTF-8
            char* dbPath = [dbFilePath UTF8String];
            
            //声明sqlite数据库结构体的指针
            sqlite3* contactDB;
        //    sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)
        //    sqlite3_open(dbPath, &contactDB)表示打开dbPath路径下的数据库，如果不存在，则创建它
            if(sqlite3_open(dbPath, &contactDB) == SQLITE_OK){
                NSLog(@"数据库打开成功");
            }else
            {
                NSLog(@"数据库打开失败");
            }
    //    常规操作，打开数据库
        
        //创建指令
        char sqlite_stmt[1000];
        snprintf(sqlite_stmt, 1000,
                 "DELETE FROM CONTACTS WHERE NAME = \"张三\"");
    //    执行指令
        if (sqlite3_exec(contactDB, sqlite_stmt, NULL, NULL, NULL) == SQLITE_OK) {
            NSLog(@"删除数据成功");
        }else
        {
            NSLog(@"删除数据失败");
        }
        
    //    关闭数据库
        sqlite3_close(contactDB);
}

//修改数据

-(void)updateRow
{
    //    常规操作，打开数据库
        //    获取数据库文件路径
            NSString * dbFilePath = [self sqliteFilePath];
        //    将路径字符串转化成UTF-8
            char* dbPath = [dbFilePath UTF8String];
            
            //声明sqlite数据库结构体的指针
            sqlite3* contactDB;
        //    sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)
        //    sqlite3_open(dbPath, &contactDB)表示打开dbPath路径下的数据库，如果不存在，则创建它
            if(sqlite3_open(dbPath, &contactDB) == SQLITE_OK){
                NSLog(@"数据库打开成功");
            }else
            {
                NSLog(@"数据库打开失败");
            }
    //    常规操作，打开数据库
        
        //创建指令
        char sqlite_stmt[1000];
        snprintf(sqlite_stmt, 1000,
                 "UPDATE CONTACTS SET NAME = \"李四\" WHERE NAME = \"张三\"");
    
    //    执行指令
        if (sqlite3_exec(contactDB, sqlite_stmt, NULL, NULL, NULL) == SQLITE_OK) {
            NSLog(@"修改数据成功");
        }else
        {
            NSLog(@"修改数据失败");
        }
        
    //    关闭数据库
        sqlite3_close(contactDB);
}

//读取数据库（查）
-(void)readRow
{
//    读取数据库可能有多条语句，所以语句有所不同
    
    
    //    常规操作，打开数据库
        //    获取数据库文件路径
            NSString * dbFilePath = [self sqliteFilePath];
        //    将路径字符串转化成UTF-8
            char* dbPath = [dbFilePath UTF8String];
            
            //声明sqlite数据库结构体的指针
            sqlite3* contactDB;
        //    sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)
        //    sqlite3_open(dbPath, &contactDB)表示打开dbPath路径下的数据库，如果不存在，则创建它
            if(sqlite3_open(dbPath, &contactDB) == SQLITE_OK){
                NSLog(@"数据库打开成功");
            }else
            {
                NSLog(@"数据库打开失败");
            }
    //    常规操作，打开数据库
    
    char sqlite_stmt[1000];
//    生成指令
    snprintf(sqlite_stmt, 1000, "SELECT * FROM CONTACTS");
    
//    准备一个SQLite语句，用于执行
    sqlite3_stmt * statement;
    sqlite3_prepare_v2(contactDB, sqlite_stmt, -1, &statement, NULL);
    
//    执行语句，如果找到一行的匹配数据，c则返回SQLITE_ROW
    while (sqlite3_step(statement) == SQLITE_ROW) {
//        获取到一行数据
        NSInteger index = sqlite3_column_int(statement, 0);
        NSString * name = [[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_text(statement, 1)];
        NSString * address = [[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_text(statement, 2)];
        NSString * phone = [[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_text(statement, 3)];
        NSLog(@"%ld | %@ | %@ | %@",index,name,address,phone);
    }
    
    NSLog(@"数据库读取完毕");
    
//    C语言操作，需要清理内存，清理掉之前正准备的语
    sqlite3_finalize(statement);
    
//    关闭数据库
    sqlite3_close(contactDB);
    
    
}


//创建数据表
- (IBAction)creatTableAction:(id)sender {
    
    [self creatSqliteTable];
}

//增加数据
- (IBAction)addDataAction:(id)sender {
    [self addRow];
}


//删除数据
- (IBAction)deleteDataAction:(id)sender {
    [self delteRow];
}

//修改数据
- (IBAction)updateDataAction:(id)sender {
    [self updateRow];
}

//查询数据

- (IBAction)readDataAction:(id)sender {
    [self readRow];
}



@end


